package com.shujia.wyh.day06.ketang;

/*
    多态的好处
        提高了程序的维护性(由继承保证)
        提高了程序的扩展性(由多态保证)


     多态的弊端：
        1、不能访问子类特有功能
        2、类和类之间的耦合性太强了
            今后的开发的原则：低耦合高内聚

 */
class Animal2{
    String name;
    int age;

    public void eat(){
        System.out.println("吃");
    }

    public void sleep(){
        System.out.println("睡");
    }
}

class Cat2 extends Animal2{
    @Override
    public void eat() {
        System.out.println("🐱吃🐟");
    }

    @Override
    public void sleep() {
        System.out.println("🐱蜷着睡");
    }

}

class Dog2 extends Animal2{
    @Override
    public void eat() {
        System.out.println("🐕吃🥩");
    }

    @Override
    public void sleep() {
        System.out.println("🐕趴着睡");
    }
}

class Tiger extends Animal2{
    @Override
    public void eat() {
        System.out.println("🐅吃牛肉");
    }

    @Override
    public void sleep() {
        System.out.println("🐅趴着睡");
    }
}

class AnimalTool{
    private AnimalTool(){}

//    public static void useCat(Cat2 cat2){
//        cat2.eat();
//        cat2.sleep();
//    }
//
//    public static void useDog(Dog2 dog2){
//        dog2.eat();
//        dog2.sleep();
//    }

    public static void useAnimal(Animal2 animal2){ //Animal2 animal2 = new Tiger()
        animal2.eat();
        animal2.sleep();
    }
}

public class DuoTaiDemo2 {
    public static void main(String[] args) {
        //我想养一只猫
        Cat2 a1 = new Cat2();
//        a1.eat();
//        a1.sleep();
//        useCat(a1);
//        AnimalTool.useCat(a1);
        AnimalTool.useAnimal(a1); //new Cat2()

        //我还想养一只猫
        Cat2 a2 = new Cat2();
//        a2.eat();
//        a2.sleep();
//        useCat(a2);
//        AnimalTool.useCat(a2);
        AnimalTool.useAnimal(a2);
        //我还想养n只猫，又需要newn次，调用2n次方法，new对象我们避免不了n次，方法调用我可以进行封装
        //我不想养猫，我想养🐕
        Dog2 dog2 = new Dog2();
//        dog2.eat();
//        dog2.sleep();
        //随着我养的狗越来越多，这里就要new很多次
//        useDog(dog2);
//        AnimalTool.useDog(dog2);
        AnimalTool.useAnimal(dog2);
        //我不仅想要养狗或者猫了，我还想养🐅，🦁，熊猫等n种动物，咋办？
        //应该先写对应的动物类，继承自Animal类，然后再编写对应动物的方法，然后new对象调用。
        //随着动物的增多，类不可避免的增多，但是本类而言，方法也就变多了。
        //于是乎就在想，能不能将这些方法移动到一个类里面去，编写成动物的工具类
        //虽然我们使用工具类能够减轻本类的压力，但是呢我们之前说过，工具类不能够随意地改动
        //有什么方法既能够可以使用工具类调用方法，也可以做到不改变工具类里面的内容呢？
        Tiger tiger = new Tiger();
        AnimalTool.useAnimal(tiger);

    }

//    public static void useCat(Cat2 cat2){
//        cat2.eat();
//        cat2.sleep();
//    }
//
//    public static void useDog(Dog2 dog2){
//        dog2.eat();
//        dog2.sleep();
//    }
}
